Este laboratorio corresponde al 34% de la calificación total del curso y su entrega está planteada para el final de la semana 8. Su objetivo es poner en práctica las competencias adquiridas sobre el uso de los paquetes Pandas, Seaborn y Scikit Learn, entre otros, para hacer exploración, análisis descriptivo, y abordar preguntas de negocio para un caso basado en datos reales.
Especificamente, al desarrollar este laboratorio pondrás a prueba tus habilidades para:
Te recomendamos leer por completo el enunciado del laboratorio antes de comenzar, de forma que tengas claro el propósito completo de la actividad, y puedas desarrollar tu solución apuntando a él en cada paso.
El ICFES es el Instituto Colombiano para el Fomento de la Educación Superior y está adscrito al Ministerio de Educación a nivel nacional. Como parte de sus funciones, el ICFES administra las pruebas Saber 11, las cuales evalúan a todos los estudiantes del país al final de su educación secundaria. El examen contiene preguntas que evalúan una variedad de áreas del conocimiento (p.ej., matemáticas, ciencias naturales), y se lleva a cabo dos veces al año, respondiendo a los diferentes calendarios académicos que siguen las instituciones educativas. Al momento de inscribirse a las pruebas, los estudiantes deben llenar un formulario que recoge información socio-demográfica y relacionada con la institución a la que pertenecen, con el fin de obtener evidencia respecto al desempeño de los estudiantes en la prueba según sus condiciones particulares.
Al igual que otros países de la región, Colombia tiene grandes retos en términos de desigualdad, particularmente en el contexto de educación primaria y secundaria. Por esta razón, para el Estado colombiano es muy valioso el amplio registro de datos que el ICFES genera alrededor de las Pruebas Saber 11, pues con ellos se pueden generar análisis sobre la calidad de la educación en el país y eventualmente dar lugar a recomendaciones sobre políticas públicas. En particular, la problemática a abordar en este caso de estudio es desigualdad y factores de éxito en las pruebas Saber 11.
Los objetivos de este caso de estudio son:
Esta misión consiste en hacerse una idea general del contenido de los datos y seleccionar un segmento de ellos que tenga potencial para los análisis propuestos.
Pautas generales:
Preguntas guía:
Esta misión corresponde a trabajo interno del analista, por lo cual no tiene un entregable para el cliente. Como entregable, puedes generar un reporte básico sobre el contenido de los archivos de datos, ya sea a través de la impresión de mensajes, la presentación de tablas resumen, u otros.
# configuración directorio de trabajo
import os
os.chdir("C:/Users/CamiloAndradePerez/Documents/CAMILO ANDRADE PEREZ/Educación Formal/Maestría Analítica Uniandes/Semestre I/HCAD/Laboratorio 2/archivos fuente")
import pandas as pd
import numpy as np
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
# carga de archivos fuente años 2019, 2020 y 2021
# realicé un proceso manual en excel de ajuste para la unificación de los campos de las fuentes de datos
# por la complejidad de esto proceso habría sido imposible para mí realizarlo en Python con mi nivel de
# habilidad en el lenguaje
SB11_20211 = pd.read_csv("./SB11_20211.csv", sep = ";", engine = 'python', encoding='utf-8')
SB11_20201 = pd.read_csv("./SB11_20201.csv", sep = ";", engine = 'python', encoding='utf-8')
#SB11_20202 = pd.read_csv("./SB11_20202.csv", sep = ";", engine = 'python', encoding='utf-8')
SB11_20191 = pd.read_csv("./SB11_20191.csv", sep = ";", engine = 'python', encoding='utf-8')
#SB11_20192 = pd.read_csv("./SB11_20192.csv", sep = ";", engine = 'python', encoding='utf-8')
# Consolidación de los archivos fuente
# SB11_19_20_21 = pd.concat([SB11_20211, SB11_20201, SB11_20202, SB11_20191, SB_20192])
SB11_19_20_21 = pd.concat([SB11_20211, SB11_20201, SB11_20191])
# Inspección general del archivo consolidado
SB11_19_20_21
| ESTU_TIPODOCUMENTO | ESTU_NACIONALIDAD | ESTU_GENERO | ESTU_FECHANACIMIENTO | PERIODO | ESTU_CONSECUTIVO | ESTU_ESTUDIANTE | ESTU_PAIS_RESIDE | ESTU_TIENEETNIA | ESTU_DEPTO_RESIDE | ... | DESEMP_INGLES | PUNT_GLOBAL | PERCENTIL_GLOBAL | ESTU_INSE_INDIVIDUAL | ESTU_NSE_INDIVIDUAL | ESTU_NSE_ESTABLECIMIENTO | ESTU_ESTADOINVESTIGACION | ESTU_GENERACION-E | PERCENTIL_ESPECIAL_GLOBAL | ESTU_ETNIA | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | TI | COLOMBIA | M | 5/11/2003 | 20211 | SB11202110042506 | ESTUDIANTE | COLOMBIA | No | VALLE | ... | A2 | 303 | 46.0 | NaN | NaN | NaN | PUBLICAR | NaN | NaN | NaN |
| 1 | TI | COLOMBIA | F | 6/10/2004 | 20211 | SB11202110041799 | ESTUDIANTE | COLOMBIA | No | VALLE | ... | B1 | 325 | 62.0 | NaN | NaN | NaN | PUBLICAR | NaN | NaN | NaN |
| 2 | TI | COLOMBIA | F | 1/10/2003 | 20211 | SB11202110043835 | ESTUDIANTE | COLOMBIA | No | VALLE | ... | B1 | 374 | 92.0 | NaN | NaN | NaN | PUBLICAR | NaN | NaN | NaN |
| 3 | TI | COLOMBIA | F | 13/01/2003 | 20211 | SB11202110043668 | ESTUDIANTE | COLOMBIA | No | VALLE | ... | A2 | 282 | 34.0 | NaN | NaN | NaN | PUBLICAR | NaN | NaN | NaN |
| 4 | TI | COLOMBIA | F | 29/08/2004 | 20211 | SB11202110043350 | ESTUDIANTE | COLOMBIA | No | VALLE | ... | A2 | 288 | 38.0 | NaN | NaN | NaN | PUBLICAR | NaN | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 21078 | TI | COLOMBIA | F | 6/10/2002 | 20191 | SB11201910016389 | ESTUDIANTE | COLOMBIA | No | CAUCA | ... | A2 | 281 | 48.0 | 61.528482 | 3.0 | 3.0 | PUBLICAR | NO | NaN | NaN |
| 21079 | TI | COLOMBIA | F | 3/02/2002 | 20191 | SB11201910016418 | ESTUDIANTE | COLOMBIA | No | CAUCA | ... | A2 | 273 | 45.0 | 50.963043 | 2.0 | 3.0 | PUBLICAR | NO | NaN | NaN |
| 21080 | TI | COLOMBIA | M | 17/04/2003 | 20191 | SB11201910016407 | ESTUDIANTE | COLOMBIA | No | CAUCA | ... | A2 | 294 | 54.0 | 60.603929 | 3.0 | 3.0 | PUBLICAR | NO | NaN | NaN |
| 21081 | TI | COLOMBIA | M | 14/06/2002 | 20191 | SB11201910016424 | ESTUDIANTE | COLOMBIA | No | CAUCA | ... | A2 | 287 | 51.0 | 64.740929 | 4.0 | 3.0 | PUBLICAR | NO | NaN | NaN |
| 21082 | TI | COLOMBIA | M | 11/01/2002 | 20191 | SB11201910016385 | ESTUDIANTE | COLOMBIA | No | CAUCA | ... | A2 | 321 | 67.0 | 59.777995 | 3.0 | 3.0 | PUBLICAR | NO | NaN | NaN |
52046 rows × 83 columns
# Conversión a Dataframe de Pamdas
df_original = pd.DataFrame(SB11_19_20_21)
# cantidad de campos
df_original.columns
Index(['ESTU_TIPODOCUMENTO', 'ESTU_NACIONALIDAD', 'ESTU_GENERO',
'ESTU_FECHANACIMIENTO', 'PERIODO', 'ESTU_CONSECUTIVO',
'ESTU_ESTUDIANTE', 'ESTU_PAIS_RESIDE', 'ESTU_TIENEETNIA',
'ESTU_DEPTO_RESIDE', 'ESTU_COD_RESIDE_DEPTO', 'ESTU_MCPIO_RESIDE',
'ESTU_COD_RESIDE_MCPIO', 'FAMI_ESTRATOVIVIENDA', 'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR', 'FAMI_EDUCACIONPADRE', 'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE', 'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEINTERNET', 'FAMI_TIENESERVICIOTV', 'FAMI_TIENECOMPUTADOR',
'FAMI_TIENELAVADORA', 'FAMI_TIENEHORNOMICROOGAS', 'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA', 'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_NUMLIBROS', 'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO', 'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA', 'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET', 'ESTU_HORASSEMANATRABAJA',
'ESTU_TIPOREMUNERACION', 'COLE_CODIGO_ICFES',
'COLE_COD_DANE_ESTABLECIMIENTO', 'COLE_NOMBRE_ESTABLECIMIENTO',
'COLE_GENERO', 'COLE_NATURALEZA', 'COLE_CALENDARIO', 'COLE_BILINGUE',
'COLE_CARACTER', 'COLE_COD_DANE_SEDE', 'COLE_NOMBRE_SEDE',
'COLE_SEDE_PRINCIPAL', 'COLE_AREA_UBICACION', 'COLE_JORNADA',
'COLE_COD_MCPIO_UBICACION', 'COLE_MCPIO_UBICACION',
'COLE_COD_DEPTO_UBICACION', 'COLE_DEPTO_UBICACION',
'ESTU_PRIVADO_LIBERTAD', 'ESTU_COD_MCPIO_PRESENTACION',
'ESTU_MCPIO_PRESENTACION', 'ESTU_DEPTO_PRESENTACION',
'ESTU_COD_DEPTO_PRESENTACION', 'PUNT_LECTURA_CRITICA',
'PERCENTIL_LECTURA_CRITICA', 'DESEMP_LECTURA_CRITICA',
'PUNT_MATEMATICAS', 'PERCENTIL_MATEMATICAS', 'DESEMP_MATEMATICAS',
'PUNT_C_NATURALES', 'PERCENTIL_C_NATURALES', 'DESEMP_C_NATURALES',
'PUNT_SOCIALES_CIUDADANAS', 'PERCENTIL_SOCIALES_CIUDADANAS',
'DESEMP_SOCIALES_CIUDADANAS', 'PUNT_INGLES', 'PERCENTIL_INGLES',
'DESEMP_INGLES', 'PUNT_GLOBAL', 'PERCENTIL_GLOBAL',
'ESTU_INSE_INDIVIDUAL', 'ESTU_NSE_INDIVIDUAL',
'ESTU_NSE_ESTABLECIMIENTO', 'ESTU_ESTADOINVESTIGACION',
'ESTU_GENERACION-E', 'PERCENTIL_ESPECIAL_GLOBAL', 'ESTU_ETNIA'],
dtype='object')
print ("Cantidad de columnas Dataframe_Original: ", len(df_original.columns))
Cantidad de columnas Dataframe_Original: 83
# Conteo de valores nulos para cada campo
conteo_nulos = df_original.isna().sum()
conteo_nulos
ESTU_TIPODOCUMENTO 0
ESTU_NACIONALIDAD 0
ESTU_GENERO 6
ESTU_FECHANACIMIENTO 0
PERIODO 0
...
ESTU_NSE_ESTABLECIMIENTO 15537
ESTU_ESTADOINVESTIGACION 0
ESTU_GENERACION-E 15528
PERCENTIL_ESPECIAL_GLOBAL 51891
ESTU_ETNIA 51823
Length: 83, dtype: int64
# Definición del umbral de valores nulos de 15%
umbral_nulos = 52046*0.15
# Identificación de campos con observaciones nulas superior al umbral de 15% del total de las observaciones
conteo_nulos.loc[(conteo_nulos >= umbral_nulos)]
COLE_BILINGUE 9284 ESTU_INSE_INDIVIDUAL 17065 ESTU_NSE_INDIVIDUAL 17065 ESTU_NSE_ESTABLECIMIENTO 15537 ESTU_GENERACION-E 15528 PERCENTIL_ESPECIAL_GLOBAL 51891 ESTU_ETNIA 51823 dtype: int64
# Creación de nuevo dataframe para eliminar campos con observaciones nulas superior al umbral
df_no_nulos = df_original
# Eliminación de campos con observaciones nulas superior al umbral
df_no_nulos.drop(axis = 1, columns = 'COLE_BILINGUE', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'ESTU_INSE_INDIVIDUAL', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'ESTU_NSE_INDIVIDUAL', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'ESTU_NSE_ESTABLECIMIENTO', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'ESTU_GENERACION-E', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'PERCENTIL_ESPECIAL_GLOBAL', inplace = True)
df_no_nulos.drop(axis = 1, columns = 'ESTU_ETNIA', inplace = True)
# Conteo colummas dataframe no nulos
print ("Cantidad de columnas Dataframe_No_Nulos: ", len(df_no_nulos.columns))
Cantidad de columnas Dataframe_No_Nulos: 76
# Descriptivos generales del dataset consolidado y depurado de campos con mas nulos que el umbral
campos_numericos = df_no_nulos.describe()
campos_numericos
| PERIODO | ESTU_COD_RESIDE_DEPTO | ESTU_COD_RESIDE_MCPIO | COLE_CODIGO_ICFES | COLE_COD_DANE_ESTABLECIMIENTO | COLE_COD_DANE_SEDE | COLE_COD_MCPIO_UBICACION | COLE_COD_DEPTO_UBICACION | ESTU_COD_MCPIO_PRESENTACION | ESTU_COD_DEPTO_PRESENTACION | ... | PUNT_C_NATURALES | PERCENTIL_C_NATURALES | DESEMP_C_NATURALES | PUNT_SOCIALES_CIUDADANAS | PERCENTIL_SOCIALES_CIUDADANAS | DESEMP_SOCIALES_CIUDADANAS | PUNT_INGLES | PERCENTIL_INGLES | PUNT_GLOBAL | PERCENTIL_GLOBAL | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 52046.000000 | 51257.000000 | 51257.000000 | 52046.000000 | 5.204600e+04 | 5.204600e+04 | 52046.000000 | 52046.000000 | 52046.000000 | 52046.000000 | ... | 52046.000000 | 52046.000000 | 52046.000000 | 52046.000000 | 52046.000000 | 52046.000000 | 51963.000000 | 51999.000000 | 52046.000000 | 51963.000000 |
| mean | 20199.932675 | 43.161363 | 43248.364536 | 139763.604792 | 3.470895e+11 | 3.472479e+11 | 43504.140568 | 43.391231 | 42934.809572 | 42.862199 | ... | 56.136245 | 50.405507 | 2.540176 | 55.687584 | 50.408024 | 2.518599 | 64.145661 | 50.502837 | 289.943953 | 50.352828 |
| std | 8.318996 | 30.669486 | 30683.416385 | 190189.940087 | 5.187690e+10 | 5.253951e+10 | 30447.708495 | 30.449546 | 30820.485527 | 30.813143 | ... | 12.650197 | 28.885521 | 0.879845 | 13.972571 | 28.886506 | 0.947457 | 18.126986 | 28.997884 | 62.559452 | 28.872727 |
| min | 20191.000000 | 5.000000 | 5001.000000 | 182.000000 | 1.050010e+11 | 1.050010e+11 | 5001.000000 | 5.000000 | 5001.000000 | 5.000000 | ... | 0.000000 | 1.000000 | 1.000000 | 0.000000 | 1.000000 | 1.000000 | 0.000000 | 1.000000 | 0.000000 | 1.000000 |
| 25% | 20191.000000 | 11.000000 | 11001.000000 | 24430.000000 | 3.110010e+11 | 3.110010e+11 | 11001.000000 | 11.000000 | 11001.000000 | 11.000000 | ... | 47.000000 | 25.000000 | 2.000000 | 45.000000 | 25.000000 | 2.000000 | 50.000000 | 25.000000 | 242.000000 | 25.000000 |
| 50% | 20201.000000 | 47.000000 | 47001.000000 | 84368.000000 | 3.540010e+11 | 3.540010e+11 | 47001.000000 | 47.000000 | 47001.000000 | 47.000000 | ... | 57.000000 | 50.000000 | 3.000000 | 57.000000 | 50.000000 | 3.000000 | 66.000000 | 50.000000 | 297.000000 | 50.000000 |
| 75% | 20211.000000 | 76.000000 | 76001.000000 | 142851.000000 | 3.760010e+11 | 3.760010e+11 | 76001.000000 | 76.000000 | 76001.000000 | 76.000000 | ... | 66.000000 | 75.000000 | 3.000000 | 67.000000 | 75.000000 | 3.000000 | 79.000000 | 75.000000 | 340.000000 | 75.000000 |
| max | 20211.000000 | 99.000000 | 99001.000000 | 752717.000000 | 6.252690e+11 | 8.180010e+11 | 95001.000000 | 95.000000 | 99001.000000 | 99.000000 | ... | 100.000000 | 100.000000 | 4.000000 | 100.000000 | 100.000000 | 4.000000 | 100.000000 | 100.000000 | 495.000000 | 100.000000 |
8 rows × 26 columns
# Creación de un nuevo dataframe para evolucionar en la depuración de campos
df_en_depuracion = df_no_nulos
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_TIPODOCUMENTO'].value_counts()
TI 40462 CC 10736 CR 439 CE 306 PE 39 PEP 35 RC 13 NES 8 PC 7 NIP 1 Name: ESTU_TIPODOCUMENTO, dtype: int64
# Eliminación del campo analizado por sus características no predictoras
df_en_depuracion.drop(axis = 1, columns = 'ESTU_TIPODOCUMENTO', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_NACIONALIDAD'].value_counts()
COLOMBIA 51707 VENEZUELA 127 ESTADOS UNIDOS 49 ESPAÑA 40 ECUADOR 19 ARGENTINA 17 MÉXICO 11 CHILE 8 FRANCIA 7 BRASIL 7 ALEMANIA 6 PORTUGAL 4 COREA DEL SUR 4 ITALIA 4 PERÚ 3 GUATEMALA 3 NICARAGUA 3 PAÍSES BAJOS - HOLANDA 3 REINO UNIDO 3 INDIA 2 HONDURAS 2 BOLIVIA 2 COSTA RICA 1 NORUEGA 1 SUIZA 1 ARUBA 1 EL SALVADOR 1 NAMIBIA 1 AUSTRALIA 1 TAIWAN 1 HAITI 1 CUBA 1 CHINA 1 BELICE 1 COREA DEL NORTE 1 RUSIA 1 CANADÁ 1 Name: ESTU_NACIONALIDAD, dtype: int64
# Eliminación del campo analizado por sus características no predictoras
df_en_depuracion.drop(axis = 1, columns = 'ESTU_NACIONALIDAD', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_GENERO'].value_counts()
M 26268 F 25772 Name: ESTU_GENERO, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_FECHANACIMIENTO'].value_counts()
1/01/1900 117
1/11/2002 59
22/11/2002 56
21/06/2002 55
3/01/2003 53
...
8/11/2005 1
9/12/1984 1
6/12/1991 1
5/08/1988 1
15/10/1993 1
Name: ESTU_FECHANACIMIENTO, Length: 6611, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERIODO'].value_counts()
20191 21083 20211 15528 20201 15435 Name: PERIODO, dtype: int64
# Descriptivas individuales de cada campo
# Realizamos el conteo para cada valor del campo ESTU_CONSECUTIVO
ESTU_CONSECUTIVO = df_en_depuracion['ESTU_CONSECUTIVO'].value_counts()
# El resultado del conteo de cada valor individual lo convertimos a una lista
ESTU_CONSECUTIVO.tolist()
# Identificamos el máximo valor de la lista
ESTU_CONSECUTIVO.max()
1
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_ESTUDIANTE'].value_counts()
ESTUDIANTE 52046 Name: ESTU_ESTUDIANTE, dtype: int64
# Eliminación del campo analizado por sus características no predictoras
df_en_depuracion.drop(axis = 1, columns = 'ESTU_ESTUDIANTE', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_PAIS_RESIDE'].value_counts()
COLOMBIA 51707 VENEZUELA 127 ESTADOS UNIDOS 49 ESPAÑA 40 ECUADOR 19 ARGENTINA 17 MÉXICO 11 CHILE 8 FRANCIA 7 BRASIL 7 ALEMANIA 6 PORTUGAL 4 COREA DEL SUR 4 ITALIA 4 PERÚ 3 GUATEMALA 3 NICARAGUA 3 PAÍSES BAJOS - HOLANDA 3 REINO UNIDO 3 INDIA 2 HONDURAS 2 BOLIVIA 2 COSTA RICA 1 NORUEGA 1 SUIZA 1 ARUBA 1 EL SALVADOR 1 NAMIBIA 1 AUSTRALIA 1 TAIWAN 1 HAITI 1 CUBA 1 CHINA 1 BELICE 1 COREA DEL NORTE 1 RUSIA 1 CANADÁ 1 Name: ESTU_PAIS_RESIDE, dtype: int64
# Eliminación del campo analizado por sus características no predictoras
df_en_depuracion.drop(axis = 1, columns = 'ESTU_PAIS_RESIDE', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_TIENEETNIA'].value_counts()
No 49066 Si 508 Name: ESTU_TIENEETNIA, dtype: int64
df_en_depuracion['ESTU_TIENEETNIA'].isna().sum()
2472
# Eliminación del campo analizado por sus características no predictoras
df_en_depuracion.drop(axis = 1, columns = 'ESTU_TIENEETNIA', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_DEPTO_RESIDE'].value_counts()
VALLE 20776 BOGOTÁ 7187 BOGOTA 5311 ANTIOQUIA 3118 CUNDINAMARCA 2639 CAUCA 2342 ATLANTICO 1987 NARIÑO 1836 CALDAS 740 BOLIVAR 678 SANTANDER 659 RISARALDA 647 CESAR 545 META 384 NORTE SANTANDER 350 BOYACA 308 MAGDALENA 297 HUILA 287 TOLIMA 270 QUINDIO 150 LA GUAJIRA 140 PUTUMAYO 129 CORDOBA 121 CAQUETA 117 ARAUCA 74 CASANARE 71 GUAINIA 38 SUCRE 30 CHOCO 19 GUAVIARE 4 VICHADA 2 SAN ANDRES 1 Name: ESTU_DEPTO_RESIDE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_COD_RESIDE_DEPTO'].value_counts()
76.0 20776 11.0 12498 5.0 3118 25.0 2639 19.0 2342 8.0 1987 52.0 1836 17.0 740 13.0 678 68.0 659 66.0 647 20.0 545 50.0 384 54.0 350 15.0 308 47.0 297 41.0 287 73.0 270 63.0 150 44.0 140 86.0 129 23.0 121 18.0 117 81.0 74 85.0 71 94.0 38 70.0 30 27.0 19 95.0 4 99.0 2 88.0 1 Name: ESTU_COD_RESIDE_DEPTO, dtype: int64
# Procedemos entonces a RETIRAR el campo ESTU_DEPTO_RESIDE:
df_en_depuracion.drop(axis = 1, columns = 'ESTU_DEPTO_RESIDE', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_MCPIO_RESIDE'].value_counts()
CALI 16140
BOGOTÁ D.C. 12498
POPAYÁN 2002
MEDELLÍN 1890
BARRANQUILLA 1855
...
GIRALDO 1
LEBRIJA 1
CONCEPCIÓN 1
CAICEDO 1
GÁMEZA 1
Name: ESTU_MCPIO_RESIDE, Length: 328, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_COD_RESIDE_MCPIO'].value_counts()
76001.0 16140
11001.0 12498
19001.0 2002
5001.0 1890
8001.0 1855
...
41298.0 1
73483.0 1
73408.0 1
15646.0 1
5607.0 1
Name: ESTU_COD_RESIDE_MCPIO, Length: 337, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'ESTU_MCPIO_RESIDE', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_ESTRATOVIVIENDA'].value_counts()
Estrato 3 11636 Estrato 4 9463 Estrato 2 8178 Estrato 5 7897 Estrato 6 7194 Estrato 1 3339 Sin Estrato 604 Name: FAMI_ESTRATOVIVIENDA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_PERSONASHOGAR'].value_counts()
3 a 4 30138 5 a 6 11597 1 a 2 5134 7 a 8 1798 9 o más 632 Name: FAMI_PERSONASHOGAR, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_CUARTOSHOGAR'].value_counts()
Tres 22261 Dos 12432 Cuatro 9201 Cinco 2659 Uno 1538 Seis o mas 1111 Name: FAMI_CUARTOSHOGAR, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_EDUCACIONPADRE'].value_counts()
Educación profesional completa 14133 Postgrado 8816 Secundaria (Bachillerato) completa 7515 Secundaria (Bachillerato) incompleta 3256 Técnica o tecnológica completa 3207 No sabe 3015 Primaria incompleta 2809 Educación profesional incompleta 1883 Primaria completa 1649 Técnica o tecnológica incompleta 912 Ninguno 763 No Aplica 510 Name: FAMI_EDUCACIONPADRE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_EDUCACIONMADRE'].value_counts()
Educación profesional completa 16648 Postgrado 8147 Secundaria (Bachillerato) completa 7379 Técnica o tecnológica completa 4246 Secundaria (Bachillerato) incompleta 2813 Educación profesional incompleta 2287 Primaria incompleta 2250 Primaria completa 1494 No sabe 1390 Técnica o tecnológica incompleta 1263 Ninguno 449 No Aplica 113 Name: FAMI_EDUCACIONMADRE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TRABAJOLABORPADRE'].value_counts()
Trabaja como profesional (por ejemplo médico, abogado, ingeniero) 14491 Es dueño de un negocio grande, tiene un cargo de nivel directivo o gerencial 6029 Es dueño de un negocio pequeño (tiene pocos empleados o no tiene, por ejemplo tienda, papelería, etc 4313 Trabaja por cuenta propia (por ejemplo plomero, electricista) 3687 No aplica 3398 No sabe 3252 Es operario de máquinas o conduce vehículos (taxita, chofer) 2932 Es vendedor o trabaja en atención al público 2394 Trabaja en el hogar, no trabaja o estudia 2241 Tiene un trabajo de tipo auxiliar administrativo (por ejemplo, secretario o asistente) 1733 Es agricultor, pesquero o jornalero 1674 Pensionado 1628 Trabaja como personal de limpieza, mantenimiento, seguridad o construcción 1371 Name: FAMI_TRABAJOLABORPADRE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TRABAJOLABORMADRE'].value_counts()
Trabaja como profesional (por ejemplo médico, abogado, ingeniero) 13672 Trabaja en el hogar, no trabaja o estudia 12396 Es dueño de un negocio pequeño (tiene pocos empleados o no tiene, por ejemplo tienda, papelería, etc 4600 Tiene un trabajo de tipo auxiliar administrativo (por ejemplo, secretario o asistente) 4406 Es dueño de un negocio grande, tiene un cargo de nivel directivo o gerencial 3405 Es vendedor o trabaja en atención al público 3134 No aplica 1802 Trabaja como personal de limpieza, mantenimiento, seguridad o construcción 1689 Trabaja por cuenta propia (por ejemplo plomero, electricista) 1637 No sabe 1011 Pensionado 608 Es agricultor, pesquero o jornalero 435 Es operario de máquinas o conduce vehículos (taxita, chofer) 385 Name: FAMI_TRABAJOLABORMADRE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENEINTERNET'].value_counts()
Si 44923 No 3539 Name: FAMI_TIENEINTERNET, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'FAMI_TIENEINTERNET', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENESERVICIOTV'].value_counts()
Si 44053 No 4348 Name: FAMI_TIENESERVICIOTV, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'FAMI_TIENESERVICIOTV', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENECOMPUTADOR'].value_counts()
Si 43531 No 5719 Name: FAMI_TIENECOMPUTADOR, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'FAMI_TIENECOMPUTADOR', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENELAVADORA'].value_counts()
Si 45519 No 3693 Name: FAMI_TIENELAVADORA, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'FAMI_TIENELAVADORA', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENEHORNOMICROOGAS'].value_counts()
Si 39055 No 10115 Name: FAMI_TIENEHORNOMICROOGAS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENEAUTOMOVIL'].value_counts()
Si 33243 No 15887 Name: FAMI_TIENEAUTOMOVIL, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENEMOTOCICLETA'].value_counts()
No 34732 Si 14425 Name: FAMI_TIENEMOTOCICLETA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_TIENECONSOLAVIDEOJUEGOS'].value_counts()
Si 27176 No 21964 Name: FAMI_TIENECONSOLAVIDEOJUEGOS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_NUMLIBROS'].value_counts()
26 A 100 LIBROS 16075 11 A 25 LIBROS 10977 MÁS DE 100 LIBROS 10924 0 A 10 LIBROS 9628 Name: FAMI_NUMLIBROS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_COMELECHEDERIVADOS'].value_counts()
Todos o casi todos los días 26304 3 a 5 veces por semana 11081 1 o 2 veces por semana 8553 Nunca o rara vez comemos eso 2145 Name: FAMI_COMELECHEDERIVADOS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_COMECARNEPESCADOHUEVO'].value_counts()
Todos o casi todos los días 31969 3 a 5 veces por semana 10279 1 o 2 veces por semana 4973 Nunca o rara vez comemos eso 1178 Name: FAMI_COMECARNEPESCADOHUEVO, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_COMECEREALFRUTOSLEGUMBRE'].value_counts()
3 a 5 veces por semana 17066 Todos o casi todos los días 16004 1 o 2 veces por semana 12345 Nunca o rara vez comemos eso 2939 Name: FAMI_COMECEREALFRUTOSLEGUMBRE, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['FAMI_SITUACIONECONOMICA'].value_counts()
Igual 29428 Mejor 11503 Peor 8210 Name: FAMI_SITUACIONECONOMICA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_DEDICACIONLECTURADIARIA'].value_counts()
30 minutos o menos 16247 Entre 30 y 60 minutos 13727 No leo por entretenimiento 10959 Entre 1 y 2 horas 5402 Más de 2 horas 2093 Name: ESTU_DEDICACIONLECTURADIARIA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_DEDICACIONINTERNET'].value_counts()
Entre 1 y 3 horas 17836 Más de 3 horas 17363 Entre 30 y 60 minutos 8175 30 minutos o menos 3890 No Navega Internet 1107 Name: ESTU_DEDICACIONINTERNET, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_HORASSEMANATRABAJA'].value_counts()
0 35487 Menos de 10 horas 6281 Entre 11 y 20 horas 3056 Más de 30 horas 2886 Entre 21 y 30 horas 1520 Name: ESTU_HORASSEMANATRABAJA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_TIPOREMUNERACION'].value_counts()
No 36971 Si, en efectivo 10730 Si, en especie 708 Si, en efectivo y especie 681 Name: ESTU_TIPOREMUNERACION, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_CODIGO_ICFES'].value_counts()
58727 519
36681 395
16691 387
17335 368
17228 368
...
721001 1
669978 1
708529 1
742007 1
193326 1
Name: COLE_CODIGO_ICFES, Length: 1108, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_COD_DANE_ESTABLECIMIENTO'].value_counts()
3.760010e+11 15820
3.110010e+11 7214
3.118480e+11 2522
3.050010e+11 2174
3.117690e+11 2088
...
2.252900e+11 1
1.540010e+11 1
2.950010e+11 1
1.542610e+11 1
2.197600e+11 1
Name: COLE_COD_DANE_ESTABLECIMIENTO, Length: 280, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_NOMBRE_ESTABLECIMIENTO'].value_counts()
COLEGIO COMFANDI EL PRADO 519
COLEGIO LEON DE GREIFF 464
COLEGIO MAYOR SAN FRANCISCO DE ASIS 424
COMFANDI MIRAFLORES 395
COLEGIO AMERICANO 387
...
COLEGIO USAQUEN (IED) 1
INSTITUCION EDUCATIVA ALTO DEL ROMPE 1
GIMN. LATINOAMERICANO 1
COL SURCOLOMBIANO TIMANCO 1
IE NARCISO CABAL SALCEDO 1
Name: COLE_NOMBRE_ESTABLECIMIENTO, Length: 970, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'COLE_NOMBRE_ESTABLECIMIENTO', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_GENERO'].value_counts()
MIXTO 47263 FEMENINO 3296 MASCULINO 1487 Name: COLE_GENERO, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_NATURALEZA'].value_counts()
NO OFICIAL 50820 OFICIAL 1226 Name: COLE_NATURALEZA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_CALENDARIO'].value_counts()
B 38611 A 11079 OTRO 2356 Name: COLE_CALENDARIO, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_CARACTER'].value_counts()
ACADÉMICO 39222 TÉCNICO 5187 TÉCNICO/ACADÉMICO 4023 NO APLICA 342 Name: COLE_CARACTER, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_COD_DANE_SEDE'].value_counts()
3.760010e+11 15820
3.110010e+11 7218
3.118480e+11 2522
3.050010e+11 2174
3.117690e+11 2088
...
2.252900e+11 1
1.540010e+11 1
2.950010e+11 1
1.542610e+11 1
2.197600e+11 1
Name: COLE_COD_DANE_SEDE, Length: 281, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_NOMBRE_SEDE'].value_counts()
COLEGIO COMFANDI EL PRADO 519
COLEGIO LEON DE GREIFF 464
COLEGIO MAYOR SAN FRANCISCO DE ASIS - SEDE PRINCIPAL 424
COMFANDI MIRAFLORES 395
COLEGIO AMERICANO 387
...
SEC ESC MARCO FIDEL SUAREZ 1
LIC MODERNO BETANIA - SEDE PRINCIPAL 1
TÉCNICA INDUSTRIAL ESPAÑA 1
CENT EDUC DIST EL SALITRE 1
I E TEC JORGE ARDILA DUARTE 1
Name: COLE_NOMBRE_SEDE, Length: 970, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_SEDE_PRINCIPAL'].value_counts()
S 51971 N 75 Name: COLE_SEDE_PRINCIPAL, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'COLE_SEDE_PRINCIPAL', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_AREA_UBICACION'].value_counts()
URBANO 45655 RURAL 6391 Name: COLE_AREA_UBICACION, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_JORNADA'].value_counts()
COMPLETA 25389 MAÑANA 15785 SABATINA 5186 NOCHE 3559 TARDE 1327 UNICA 800 Name: COLE_JORNADA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_COD_MCPIO_UBICACION'].value_counts()
76001 16236
11001 11963
19001 2036
76520 1926
5001 1647
...
73270 1
25658 1
19807 1
86749 1
52838 1
Name: COLE_COD_MCPIO_UBICACION, Length: 185, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_MCPIO_UBICACION'].value_counts()
CALI 16236
BOGOTÁ D.C. 11963
POPAYÁN 2036
PALMIRA 1926
MEDELLÍN 1647
...
SARAVENA 1
ANDES 1
SIBUNDOY 1
LORICA 1
SAN FRANCISCO 1
Name: COLE_MCPIO_UBICACION, Length: 184, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'COLE_MCPIO_UBICACION', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_COD_DEPTO_UBICACION'].value_counts()
76 21008 11 11963 25 3589 5 3089 19 2341 8 2013 52 1837 68 771 17 729 66 716 13 680 20 540 50 385 54 373 15 307 73 301 47 289 41 276 63 141 44 140 86 127 23 125 18 110 81 72 85 40 94 36 70 28 27 15 95 5 Name: COLE_COD_DEPTO_UBICACION, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['COLE_DEPTO_UBICACION'].value_counts()
VALLE 21008 BOGOTÁ 6869 BOGOTA 5094 CUNDINAMARCA 3589 ANTIOQUIA 3089 CAUCA 2341 ATLANTICO 2013 NARIÑO 1837 SANTANDER 771 CALDAS 729 RISARALDA 716 BOLIVAR 680 CESAR 540 META 385 NORTE SANTANDER 373 BOYACA 307 TOLIMA 301 MAGDALENA 289 HUILA 276 QUINDIO 141 LA GUAJIRA 140 PUTUMAYO 127 CORDOBA 125 CAQUETA 110 ARAUCA 72 CASANARE 40 GUAINIA 36 SUCRE 28 CHOCO 15 GUAVIARE 5 Name: COLE_DEPTO_UBICACION, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'COLE_DEPTO_UBICACION', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_PRIVADO_LIBERTAD'].value_counts()
N 52020 S 26 Name: ESTU_PRIVADO_LIBERTAD, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'ESTU_PRIVADO_LIBERTAD', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_COD_MCPIO_PRESENTACION'].value_counts()
76001 17348
11001 13475
5001 3002
76520 2256
19001 2064
...
5154 2
50330 2
86320 1
23466 1
41396 1
Name: ESTU_COD_MCPIO_PRESENTACION, Length: 78, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_MCPIO_PRESENTACION'].value_counts()
CALI 17348
BOGOTÁ D.C. 13475
MEDELLÍN 3002
PALMIRA 2256
POPAYÁN 2064
...
BARBOSA 2
PUERTO CARREÑO 2
MONTELÍBANO 1
ORITO 1
LA PLATA 1
Name: ESTU_MCPIO_PRESENTACION, Length: 78, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'ESTU_MCPIO_PRESENTACION', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_DEPTO_PRESENTACION'].value_counts()
VALLE 20984 BOGOTÁ 7882 BOGOTA 5593 ANTIOQUIA 3169 CAUCA 2350 CUNDINAMARCA 1998 ATLANTICO 1996 NARIÑO 1864 CALDAS 774 BOLIVAR 685 SANTANDER 679 RISARALDA 666 CESAR 553 META 391 NORTE SANTANDER 387 BOYACA 320 MAGDALENA 295 HUILA 291 TOLIMA 250 QUINDIO 154 LA GUAJIRA 132 PUTUMAYO 129 CORDOBA 129 CAQUETA 124 ARAUCA 73 CASANARE 67 GUAINIA 39 SUCRE 32 SAN ANDRES 18 CHOCO 16 GUAVIARE 4 VICHADA 2 Name: ESTU_DEPTO_PRESENTACION, dtype: int64
df_en_depuracion.drop(axis = 1, columns = 'ESTU_DEPTO_PRESENTACION', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_COD_DEPTO_PRESENTACION'].value_counts()
76 20984 11 13475 5 3169 19 2350 25 1998 8 1996 52 1864 17 774 13 685 68 679 66 666 20 553 50 391 54 387 15 320 47 295 41 291 73 250 63 154 44 132 86 129 23 129 18 124 81 73 85 67 94 39 70 32 88 18 27 16 95 4 99 2 Name: ESTU_COD_DEPTO_PRESENTACION, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_LECTURA_CRITICA'].value_counts()
66 1864
63 1818
67 1804
65 1770
64 1769
...
24 11
22 5
23 2
84 2
21 1
Name: PUNT_LECTURA_CRITICA, Length: 66, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_LECTURA_CRITICA'].value_counts()
3 535
2 534
4 530
10 529
1 528
...
100 514
60 514
50 514
89 513
31 511
Name: PERCENTIL_LECTURA_CRITICA, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_LECTURA_CRITICA', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['DESEMP_LECTURA_CRITICA'].value_counts()
3 22253 4 17768 2 10537 1 1488 Name: DESEMP_LECTURA_CRITICA, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_MATEMATICAS'].value_counts()
66 1519
67 1501
64 1492
68 1486
69 1476
...
18 10
17 8
16 5
0 4
15 3
Name: PUNT_MATEMATICAS, Length: 73, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_MATEMATICAS'].value_counts()
100 824
7 533
3 532
1 531
2 530
...
56 516
97 515
39 514
99 367
98 364
Name: PERCENTIL_MATEMATICAS, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_MATEMATICAS', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['DESEMP_MATEMATICAS'].value_counts()
3 26580 2 11126 4 10980 1 3360 Name: DESEMP_MATEMATICAS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_C_NATURALES'].value_counts()
63 1586
61 1577
64 1559
59 1553
62 1546
...
82 19
23 12
0 6
22 4
21 1
Name: PUNT_C_NATURALES, Length: 64, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_C_NATURALES'].value_counts()
3 532
5 531
7 530
10 529
17 529
...
85 517
74 517
70 517
66 516
53 516
Name: PERCENTIL_C_NATURALES, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_C_NATURALES', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['DESEMP_C_NATURALES'].value_counts()
3 22076 2 16289 1 7108 4 6573 Name: DESEMP_C_NATURALES, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_SOCIALES_CIUDADANAS'].value_counts()
63 1435
61 1427
65 1418
64 1406
62 1402
...
19 14
18 10
0 3
84 2
17 1
Name: PUNT_SOCIALES_CIUDADANAS, Length: 70, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_SOCIALES_CIUDADANAS'].value_counts()
1 535
2 532
32 528
6 526
15 525
...
18 517
89 516
79 516
55 516
66 515
Name: PERCENTIL_SOCIALES_CIUDADANAS, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_SOCIALES_CIUDADANAS', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['DESEMP_SOCIALES_CIUDADANAS'].value_counts()
3 20124 2 15059 1 8953 4 7910 Name: DESEMP_SOCIALES_CIUDADANAS, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_INGLES'].value_counts()
100.0 1754
79.0 1476
82.0 1411
81.0 1410
80.0 1409
...
22.0 63
0.0 38
21.0 32
92.0 24
20.0 9
Name: PUNT_INGLES, Length: 75, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_INGLES'].value_counts()
100.0 1830
92.0 555
1.0 552
94.0 537
90.0 535
...
95.0 414
96.0 217
98.0 213
97.0 209
99.0 207
Name: PERCENTIL_INGLES, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_INGLES', inplace = True)
# Descriptivas individuales de cada campo
df_en_depuracion['DESEMP_INGLES'].value_counts()
B+ 13776 A- 11266 B1 11191 A1 7907 A2 7859 Name: DESEMP_INGLES, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PUNT_GLOBAL'].value_counts()
333 397
335 386
338 386
337 385
320 383
...
122 1
91 1
475 1
476 1
0 1
Name: PUNT_GLOBAL, Length: 354, dtype: int64
# Descriptivas individuales de cada campo
df_en_depuracion['PERCENTIL_GLOBAL'].value_counts()
68.0 601
80.0 593
55.0 576
72.0 572
51.0 567
...
87.0 476
96.0 473
69.0 464
81.0 454
67.0 447
Name: PERCENTIL_GLOBAL, Length: 100, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'PERCENTIL_GLOBAL', inplace = True)
# La variable ESTU_INSE_INDIVIDUAL la vamos a MANTENER por ser un posible predictor numérico y contínuo
# Descriptivas individuales de cada campo
# Descriptivas individuales de cada campo
df_en_depuracion['ESTU_ESTADOINVESTIGACION'].value_counts()
PUBLICAR 51735 VALIDEZ OFICINA JURÍDICA 308 NO SE COMPROBO IDENTIDAD DEL EXAMINADO 3 Name: ESTU_ESTADOINVESTIGACION, dtype: int64
df_en_depuracion.drop(axis = 1 , columns = 'ESTU_ESTADOINVESTIGACION', inplace = True)
df_en_depuracion.columns
Index(['ESTU_GENERO', 'ESTU_FECHANACIMIENTO', 'PERIODO', 'ESTU_CONSECUTIVO',
'ESTU_COD_RESIDE_DEPTO', 'ESTU_COD_RESIDE_MCPIO',
'FAMI_ESTRATOVIVIENDA', 'FAMI_PERSONASHOGAR', 'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE', 'FAMI_EDUCACIONMADRE', 'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE', 'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL', 'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS', 'FAMI_NUMLIBROS',
'FAMI_COMELECHEDERIVADOS', 'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE', 'FAMI_SITUACIONECONOMICA',
'ESTU_DEDICACIONLECTURADIARIA', 'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA', 'ESTU_TIPOREMUNERACION', 'COLE_CODIGO_ICFES',
'COLE_COD_DANE_ESTABLECIMIENTO', 'COLE_GENERO', 'COLE_NATURALEZA',
'COLE_CALENDARIO', 'COLE_CARACTER', 'COLE_COD_DANE_SEDE',
'COLE_NOMBRE_SEDE', 'COLE_AREA_UBICACION', 'COLE_JORNADA',
'COLE_COD_MCPIO_UBICACION', 'COLE_COD_DEPTO_UBICACION',
'ESTU_COD_MCPIO_PRESENTACION', 'ESTU_COD_DEPTO_PRESENTACION',
'PUNT_LECTURA_CRITICA', 'DESEMP_LECTURA_CRITICA', 'PUNT_MATEMATICAS',
'DESEMP_MATEMATICAS', 'PUNT_C_NATURALES', 'DESEMP_C_NATURALES',
'PUNT_SOCIALES_CIUDADANAS', 'DESEMP_SOCIALES_CIUDADANAS', 'PUNT_INGLES',
'DESEMP_INGLES', 'PUNT_GLOBAL'],
dtype='object')
# Definir un sub-conjunto de variables (e.g., una lista) que puedan ser relevantes para la problemática de interés
subconjunto_variables = df_en_depuracion.columns
subconjunto_variables
Index(['ESTU_GENERO', 'ESTU_FECHANACIMIENTO', 'PERIODO', 'ESTU_CONSECUTIVO',
'ESTU_COD_RESIDE_DEPTO', 'ESTU_COD_RESIDE_MCPIO',
'FAMI_ESTRATOVIVIENDA', 'FAMI_PERSONASHOGAR', 'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE', 'FAMI_EDUCACIONMADRE', 'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE', 'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL', 'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS', 'FAMI_NUMLIBROS',
'FAMI_COMELECHEDERIVADOS', 'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE', 'FAMI_SITUACIONECONOMICA',
'ESTU_DEDICACIONLECTURADIARIA', 'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA', 'ESTU_TIPOREMUNERACION', 'COLE_CODIGO_ICFES',
'COLE_COD_DANE_ESTABLECIMIENTO', 'COLE_GENERO', 'COLE_NATURALEZA',
'COLE_CALENDARIO', 'COLE_CARACTER', 'COLE_COD_DANE_SEDE',
'COLE_NOMBRE_SEDE', 'COLE_AREA_UBICACION', 'COLE_JORNADA',
'COLE_COD_MCPIO_UBICACION', 'COLE_COD_DEPTO_UBICACION',
'ESTU_COD_MCPIO_PRESENTACION', 'ESTU_COD_DEPTO_PRESENTACION',
'PUNT_LECTURA_CRITICA', 'DESEMP_LECTURA_CRITICA', 'PUNT_MATEMATICAS',
'DESEMP_MATEMATICAS', 'PUNT_C_NATURALES', 'DESEMP_C_NATURALES',
'PUNT_SOCIALES_CIUDADANAS', 'DESEMP_SOCIALES_CIUDADANAS', 'PUNT_INGLES',
'DESEMP_INGLES', 'PUNT_GLOBAL'],
dtype='object')
# Información del dataset en proceso de depuración:
df_en_depuracion.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 52046 entries, 0 to 21082 Data columns (total 51 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 52040 non-null object 1 ESTU_FECHANACIMIENTO 52046 non-null object 2 PERIODO 52046 non-null int64 3 ESTU_CONSECUTIVO 52046 non-null object 4 ESTU_COD_RESIDE_DEPTO 51257 non-null float64 5 ESTU_COD_RESIDE_MCPIO 51257 non-null float64 6 FAMI_ESTRATOVIVIENDA 48311 non-null object 7 FAMI_PERSONASHOGAR 49299 non-null object 8 FAMI_CUARTOSHOGAR 49202 non-null object 9 FAMI_EDUCACIONPADRE 48468 non-null object 10 FAMI_EDUCACIONMADRE 48479 non-null object 11 FAMI_TRABAJOLABORPADRE 49143 non-null object 12 FAMI_TRABAJOLABORMADRE 49180 non-null object 13 FAMI_TIENEHORNOMICROOGAS 49170 non-null object 14 FAMI_TIENEAUTOMOVIL 49130 non-null object 15 FAMI_TIENEMOTOCICLETA 49157 non-null object 16 FAMI_TIENECONSOLAVIDEOJUEGOS 49140 non-null object 17 FAMI_NUMLIBROS 47604 non-null object 18 FAMI_COMELECHEDERIVADOS 48083 non-null object 19 FAMI_COMECARNEPESCADOHUEVO 48399 non-null object 20 FAMI_COMECEREALFRUTOSLEGUMBRE 48354 non-null object 21 FAMI_SITUACIONECONOMICA 49141 non-null object 22 ESTU_DEDICACIONLECTURADIARIA 48428 non-null object 23 ESTU_DEDICACIONINTERNET 48371 non-null object 24 ESTU_HORASSEMANATRABAJA 49230 non-null object 25 ESTU_TIPOREMUNERACION 49090 non-null object 26 COLE_CODIGO_ICFES 52046 non-null int64 27 COLE_COD_DANE_ESTABLECIMIENTO 52046 non-null float64 28 COLE_GENERO 52046 non-null object 29 COLE_NATURALEZA 52046 non-null object 30 COLE_CALENDARIO 52046 non-null object 31 COLE_CARACTER 48774 non-null object 32 COLE_COD_DANE_SEDE 52046 non-null float64 33 COLE_NOMBRE_SEDE 52046 non-null object 34 COLE_AREA_UBICACION 52046 non-null object 35 COLE_JORNADA 52046 non-null object 36 COLE_COD_MCPIO_UBICACION 52046 non-null int64 37 COLE_COD_DEPTO_UBICACION 52046 non-null int64 38 ESTU_COD_MCPIO_PRESENTACION 52046 non-null int64 39 ESTU_COD_DEPTO_PRESENTACION 52046 non-null int64 40 PUNT_LECTURA_CRITICA 52046 non-null int64 41 DESEMP_LECTURA_CRITICA 52046 non-null int64 42 PUNT_MATEMATICAS 52046 non-null int64 43 DESEMP_MATEMATICAS 52046 non-null int64 44 PUNT_C_NATURALES 52046 non-null int64 45 DESEMP_C_NATURALES 52046 non-null int64 46 PUNT_SOCIALES_CIUDADANAS 52046 non-null int64 47 DESEMP_SOCIALES_CIUDADANAS 52046 non-null int64 48 PUNT_INGLES 51963 non-null float64 49 DESEMP_INGLES 51999 non-null object 50 PUNT_GLOBAL 52046 non-null int64 dtypes: float64(5), int64(15), object(31) memory usage: 20.6+ MB
df_en_depuracion.to_csv('df_en_depuracion.csv', encoding='utf-8')
Esta misión consiste en utilizar análisis descriptivos para explorar patrones o relaciones en las variables de interés para la problemática planteada.
Pautas generales:
distplot, pairplot, boxplot, o violinplot, entre otros, pueden ser de utilidad.groupby de Pandas, en conjunto con la visualización, para proveer evidencia sobre el impacto de variables socio-demográficas de interés sobre el desempeño de los estudiantes en la prueba.Preguntas guía:
El entregable de esta misión es un reporte (p.ej., un conjunto de visualizaciones) que de cuenta de los comportamientos más interesantes que se observen en las variables de interés para el contexto propuesto. El propósito de esta exploración es generar hipótesis o preguntas que guíen análisis más profundos. En ese sentido, con base en lo aprendido en esta sección, identifique las tres preguntas analíticas que plantearía con mayor prioridad, teniendo en cuenta el contexto y los datos disponibles; estas preguntas NO se deben abordar en términos de código para el laboratorio (únicamente formularse).
# Carga de paquetes requeridos
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Para codificar los datos en números que se pueden usar en los diagramas de dispersión de datos categóricos
from sklearn.preprocessing import OrdinalEncoder
# Carga de datos resultado del punto anterior
SB11_P2 = pd.read_csv("./df_en_depuracion.csv", sep = ",", engine = 'python', encoding='utf-8')
# Conversión a Dataframe de Pamdas
df_P2 = pd.DataFrame(SB11_P2)
df_P2
| Unnamed: 0 | ESTU_GENERO | ESTU_FECHANACIMIENTO | PERIODO | ESTU_CONSECUTIVO | ESTU_COD_RESIDE_DEPTO | ESTU_COD_RESIDE_MCPIO | FAMI_ESTRATOVIVIENDA | FAMI_PERSONASHOGAR | FAMI_CUARTOSHOGAR | ... | DESEMP_LECTURA_CRITICA | PUNT_MATEMATICAS | DESEMP_MATEMATICAS | PUNT_C_NATURALES | DESEMP_C_NATURALES | PUNT_SOCIALES_CIUDADANAS | DESEMP_SOCIALES_CIUDADANAS | PUNT_INGLES | DESEMP_INGLES | PUNT_GLOBAL | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | M | 5/11/2003 | 20211 | SB11202110042506 | 76.0 | 76001.0 | Estrato 5 | 1 a 2 | Tres | ... | 3 | 62 | 3 | 61 | 3 | 56 | 3 | 61.0 | A2 | 303 |
| 1 | 1 | F | 6/10/2004 | 20211 | SB11202110041799 | 76.0 | 76001.0 | Estrato 3 | 3 a 4 | Tres | ... | 3 | 70 | 3 | 63 | 3 | 61 | 3 | 69.0 | B1 | 325 |
| 2 | 2 | F | 1/10/2003 | 20211 | SB11202110043835 | 76.0 | 76001.0 | Estrato 3 | 3 a 4 | Tres | ... | 4 | 66 | 3 | 62 | 3 | 73 | 4 | 69.0 | B1 | 374 |
| 3 | 3 | F | 13/01/2003 | 20211 | SB11202110043668 | 76.0 | 76001.0 | Estrato 4 | 5 a 6 | Tres | ... | 3 | 55 | 3 | 54 | 2 | 53 | 2 | 60.0 | A2 | 282 |
| 4 | 4 | F | 29/08/2004 | 20211 | SB11202110043350 | 76.0 | 76001.0 | Estrato 5 | 5 a 6 | Cuatro | ... | 3 | 67 | 3 | 53 | 2 | 53 | 2 | 60.0 | A2 | 288 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 52041 | 21078 | F | 6/10/2002 | 20191 | SB11201910016389 | 19.0 | 19001.0 | Estrato 3 | 3 a 4 | Dos | ... | 3 | 64 | 3 | 56 | 3 | 51 | 2 | 58.0 | A2 | 281 |
| 52042 | 21079 | F | 3/02/2002 | 20191 | SB11201910016418 | 19.0 | 19001.0 | Estrato 5 | 5 a 6 | Seis o mas | ... | 3 | 58 | 3 | 60 | 3 | 48 | 2 | 59.0 | A2 | 273 |
| 52043 | 21080 | M | 17/04/2003 | 20191 | SB11201910016407 | 19.0 | 19001.0 | Estrato 2 | 5 a 6 | Dos | ... | 3 | 63 | 3 | 56 | 3 | 54 | 2 | 63.0 | A2 | 294 |
| 52044 | 21081 | M | 14/06/2002 | 20191 | SB11201910016424 | 19.0 | 19001.0 | Estrato 3 | 3 a 4 | Tres | ... | 3 | 58 | 3 | 60 | 3 | 48 | 2 | 67.0 | A2 | 287 |
| 52045 | 21082 | M | 11/01/2002 | 20191 | SB11201910016385 | 19.0 | 19001.0 | Estrato 3 | 5 a 6 | Cuatro | ... | 3 | 73 | 4 | 61 | 3 | 65 | 3 | 60.0 | A2 | 321 |
52046 rows × 52 columns
# Gráfico de distribución de la variable objetivo PUNT_GLOBAL
ax = sns.distplot(df_P2['PUNT_GLOBAL'])
C:\ProgramData\Anaconda3\lib\site-packages\seaborn\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning)
print("La mediana del Puntaje Global es: ",df_P2['PUNT_GLOBAL'].median())
print("El promedio del Puntaje Global es: ",df_P2['PUNT_GLOBAL'].mean())
La mediana del Puntaje Global es: 297.0 El promedio del Puntaje Global es: 289.9439534258156
# Gráfico de distribución de la variable objetivo PUNT_GLOBAL con la función DISPLOT sugerida por Python
ax = sns.displot(df_P2['PUNT_GLOBAL'])
# Gráfico de distribución y dispersión de los diferentes puntajes
Bx = sns.pairplot(df_P2[["PUNT_GLOBAL","PUNT_LECTURA_CRITICA",'PUNT_MATEMATICAS','PUNT_C_NATURALES','PUNT_SOCIALES_CIUDADANAS','PUNT_INGLES']])
# Gráfico de caja del Puntaje Global
boxplot = df_P2.boxplot(column=['PUNT_GLOBAL'])
# Gráficos de caja de las áreas de conocimiento
boxplot = df_P2.boxplot(column=['PUNT_LECTURA_CRITICA','PUNT_MATEMATICAS','PUNT_C_NATURALES',
'PUNT_SOCIALES_CIUDADANAS','PUNT_INGLES'],
grid=True, fontsize= 5)
df_P2_nona = df_P2.dropna()
ord_enc = OrdinalEncoder()
enc_df = pd.DataFrame(ord_enc.fit_transform(df_P2_nona), columns=list(df_P2_nona.columns))
x = np.array(ord_enc.categories_).transpose()
w = columns=list(df_P2_nona.columns)
categories = pd.DataFrame(x, w)
# Generación de ruido aleatorio
xnoise, ynoise = np.random.random(len(df_P2_nona))/2, np.random.random(len(df_P2_nona))/2 # El ruido está en el rango de 0 a 0.5
# Gráfico de dispersión
plt.scatter(enc_df["DESEMP_LECTURA_CRITICA"]+xnoise, enc_df["FAMI_NUMLIBROS"]+ynoise, alpha=0.0065)
plt.xticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['DESEMP_LECTURA_CRITICA']))
plt.yticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['FAMI_NUMLIBROS']))
sns.despine(left=True, bottom=True)
<ipython-input-608-08c8d8822ef1>:3: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. x = np.array(ord_enc.categories_).transpose()
# Gráfico de dispersión para Proteina Animal y Matematicas
plt.scatter(enc_df["DESEMP_MATEMATICAS"]+xnoise, enc_df["FAMI_COMECARNEPESCADOHUEVO"]+ynoise, alpha=0.0065)
plt.xticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['DESEMP_MATEMATICAS']))
plt.yticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['FAMI_COMECARNEPESCADOHUEVO']))
sns.despine(left=True, bottom=True)
# Gráfico de dispersión para Lácteos y Ciencias Sociales
plt.scatter(enc_df["DESEMP_SOCIALES_CIUDADANAS"]+xnoise, enc_df["FAMI_COMELECHEDERIVADOS"]+ynoise, alpha=0.0065)
plt.xticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['DESEMP_SOCIALES_CIUDADANAS']))
plt.yticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['FAMI_COMELECHEDERIVADOS'])
# ,order = ("Nunca o rara vez comemos eso", "1 o 2 veces por semana", "3 a 5 veces por semana","Todos o casi todos los días")
)
sns.despine(left=True, bottom=True)
# Gráfico de dispersión para Verduras y Ciencias Naturales
plt.scatter(enc_df["DESEMP_C_NATURALES"]+xnoise, enc_df["FAMI_COMECEREALFRUTOSLEGUMBRE"]+ynoise, alpha=0.0065)
plt.xticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['DESEMP_C_NATURALES']))
plt.yticks([0.25, 1.25, 2.25, 3.25], np.unique(df_P2_nona['FAMI_COMECEREALFRUTOSLEGUMBRE'])
# ,order = ("Nunca o rara vez comemos eso", "1 o 2 veces por semana", "3 a 5 veces por semana","Todos o casi todos los días")
)
sns.despine(left=True, bottom=True)
VP_EG = sns.violinplot(x="ESTU_GENERO", y="PUNT_GLOBAL", data=df_P2, bw='scott', cut=2, scale='area')
VP_P = sns.violinplot(x="PERIODO", y="PUNT_GLOBAL", data=df_P2)
VP_EES = sns.violinplot(x="FAMI_ESTRATOVIVIENDA", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2, size = 'large',
split = True, palette = 'Set2', scale = 'area',
order = ('Sin Estrato','Estrato 1','Estrato 2','Estrato 3','Estrato 4','Estrato 5',
'Estrato 6'),
hue_order = ('F','M'))
VP_EPH = sns.violinplot(x="FAMI_PERSONASHOGAR", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2, size = 'large',
split = True, palette = 'Set2', scale = 'area',
order = ('1 a 2','3 a 4','5 a 6','7 a 8','9 o más'),hue_order = ('F','M'))
VP_ECH = sns.violinplot(x="FAMI_CUARTOSHOGAR", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2, size = 'large',
split = True, palette = 'Set2', scale = 'area',
order = ('Uno','Dos','Tres','Cuatro','Cinco','Seis o mas'),hue_order = ('F','M'))
VP_EEP = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_EDUCACIONPADRE", hue = 'ESTU_GENERO', data=df_P2, size = 'large',
split = True, palette = 'Set2', scale = 'area', orient = 'h',
order = ('Ninguno','Primaria incompleta','Primaria completa','Secundaria (Bachillerato) incompleta',
'Secundaria (Bachillerato) completa','Técnica o tecnológica incompleta','Técnica o tecnológica completa',
'Educación profesional incompleta','Educación profesional completa','Postgrado',
'No Aplica','No sabe'),
hue_order = ('F','M'))
VP_EEM = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_EDUCACIONMADRE", hue = 'ESTU_GENERO', data=df_P2, size = 'large',
split = True, palette = 'Set2', scale = 'area', orient = 'h',
order = ('Ninguno','Primaria incompleta','Primaria completa','Secundaria (Bachillerato) incompleta',
'Secundaria (Bachillerato) completa','Técnica o tecnológica incompleta','Técnica o tecnológica completa',
'Educación profesional incompleta','Educación profesional completa','Postgrado',
'No Aplica','No sabe'),
hue_order = ('F','M'))
VP_FHM = sns.violinplot(x="FAMI_TIENEHORNOMICROOGAS", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2,
split = True, palette = 'Set2', scale = 'area', orient = 'v', hue_order = ('F','M'))
VP_FTA = sns.violinplot(x="FAMI_TIENEAUTOMOVIL", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2,
split = True, palette = 'Set2', scale = 'area', orient = 'v', hue_order = ('F','M'))
VP_FTM = sns.violinplot(x="FAMI_TIENEMOTOCICLETA", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2,
split = True, palette = 'Set2', scale = 'area', orient = 'v', hue_order = ('F','M'))
VP_FCV = sns.violinplot(x="FAMI_TIENECONSOLAVIDEOJUEGOS", y="PUNT_GLOBAL", hue = 'ESTU_GENERO', data=df_P2,
split = True, palette = 'Set2', scale = 'area', orient = 'v', hue_order = ('F','M'))
VP_FNL = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_NUMLIBROS", hue = 'ESTU_GENERO', data=df_P2,
split = True, palette = 'Set2', scale = 'area', orient = 'h', hue_order = ('F','M'))
VP_FCLD = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_COMELECHEDERIVADOS", hue = 'ESTU_GENERO', data=df_P2,
order = ("Nunca o rara vez comemos eso", "1 o 2 veces por semana", "3 a 5 veces por semana",
"Todos o casi todos los días"),
split = True, palette = 'Set2', scale = 'area', orient = 'h', hue_order = ('F','M'))
VP_FCCPH = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_COMECARNEPESCADOHUEVO", hue = 'ESTU_GENERO', data=df_P2,
order = ("Nunca o rara vez comemos eso", "1 o 2 veces por semana", "3 a 5 veces por semana",
"Todos o casi todos los días"),
split = True, palette = 'Set2', scale = 'area', orient = 'h', hue_order = ('F','M'))
VP_FCCFL = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_COMECEREALFRUTOSLEGUMBRE", hue = 'ESTU_GENERO', data=df_P2,
order = ("Nunca o rara vez comemos eso", "1 o 2 veces por semana", "3 a 5 veces por semana",
"Todos o casi todos los días"),
split = True, palette = 'Set2', scale = 'area', orient = 'h', hue_order = ('F','M'))
VP_FSE = sns.violinplot(x="PUNT_GLOBAL", y="FAMI_SITUACIONECONOMICA", hue = 'ESTU_GENERO', data=df_P2,
order = ("Peor","Igual","Mejor"),
split = True, palette = 'Set2', scale = 'area', orient = 'h', hue_order = ('F','M'))
Esta misión consiste en proponer, implementar y evaluar el desempeño modelo(s) que busque(n) explicar las relaciones entre factores socio-demográficos y desempeño en la prueba.
Pautas generales:
Preguntas guía:
El entregable de esta misión es un reporte sobre el desempeño de los modelos propuestos para abordar al menos una de las preguntas guía planteadas, acompañado de una conclusión sobre los resultados del modelo (si son válidos) en el contexto de la problemática planteada.
df_P3 = df_P2.dropna()
# DEFINIMOS COMO VARIABLES OBJETIVO LAS SIGUIENTES:
# DESEMP_LECTURA_CRITICA,
# DESEMP_MATEMATICAS,
# DESEMP_C_NATURALES,
# DESEMP_SOCIALES_CIUDADANAS
# DESEMP_INGLES,
# PUNT_GLOBAL
# Realizamos la recategorización del tipo de variable para las variables objetivo, especialmente para aquellas :
# que son originalmente númericas:
df_P3["DESEMP_LECTURA_CRITICA"] = df_P3["DESEMP_LECTURA_CRITICA"].astype("category")
df_P3["DESEMP_MATEMATICAS"] = df_P3["DESEMP_MATEMATICAS"].astype("category")
df_P3["DESEMP_C_NATURALES"] = df_P3["DESEMP_C_NATURALES"].astype("category")
df_P3["DESEMP_INGLES"] = df_P3["DESEMP_INGLES"].astype("category")
df_P3["DESEMP_SOCIALES_CIUDADANAS"] = df_P3["DESEMP_SOCIALES_CIUDADANAS"].astype("category")
<ipython-input-660-dba710d98446>:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["DESEMP_LECTURA_CRITICA"] = df_P3["DESEMP_LECTURA_CRITICA"].astype("category")
<ipython-input-660-dba710d98446>:4: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["DESEMP_MATEMATICAS"] = df_P3["DESEMP_MATEMATICAS"].astype("category")
<ipython-input-660-dba710d98446>:5: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["DESEMP_C_NATURALES"] = df_P3["DESEMP_C_NATURALES"].astype("category")
<ipython-input-660-dba710d98446>:6: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["DESEMP_INGLES"] = df_P3["DESEMP_INGLES"].astype("category")
<ipython-input-660-dba710d98446>:7: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["DESEMP_SOCIALES_CIUDADANAS"] = df_P3["DESEMP_SOCIALES_CIUDADANAS"].astype("category")
df_P3["FAMI_PERSONASHOGAR"].replace({'1 a 2': 2, '3 a 4': 4, '5 a 6': 6, '7 a 8': 8, '9 o más': 10}, inplace=True)
df_P3["FAMI_CUARTOSHOGAR"].replace({'Uno': 1, 'Dos': 2, 'Tres': 3, 'Cuatro': 4, 'Cinco': 5, 'Seis o mas': 6}, inplace=True)
df_P3["FAMI_NUMLIBROS"].replace({'0 A 10 LIBROS': 10, '11 A 25 LIBROS': 25, '26 A 100 LIBROS': 50, 'MÁS DE 100 LIBROS': 100}, inplace=True)
df_P3["ESTU_DEDICACIONLECTURADIARIA"].replace({'30 minutos o menos': 30, 'Entre 1 y 2 horas': 120, 'Entre 30 y 60 minutos': 60, 'Más de 2 horas': 150, 'No leo por entretenimiento': 5}, inplace=True)
df_P3["ESTU_DEDICACIONINTERNET"].replace({'30 minutos o menos': 30, 'Entre 1 y 3 horas': 180, 'Entre 30 y 60 minutos': 60, 'Más de 3 horas': 240, 'No Navega Internet': 0}, inplace=True)
df_P3["ESTU_HORASSEMANATRABAJA"].replace({'0': 0, 'Entre 11 y 20 horas': 20, 'Entre 21 y 30 horas': 30, 'Menos de 10 horas': 10, 'Más de 30 horas': 40}, inplace=True)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py:4509: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy return super().replace(
# Reemplazo de valores de texto extensos por valores reducidos
df_P3["FAMI_TRABAJOLABORPADRE"].replace({'Trabaja como profesional (por ejemplo médico, abogado, ingeniero)': 'PROFESIONAL',
'Es dueño de un negocio grande, tiene un cargo de nivel directivo o gerencial': 'GERENTE',
'Es dueño de un negocio pequeño (tiene pocos empleados o no tiene, por ejemplo tienda, papelería, etc': 'COMERCIANTE',
'Trabaja por cuenta propia (por ejemplo plomero, electricista)': 'INDEPENDIENTE',
'Es operario de máquinas o conduce vehículos (taxita, chofer)': 'OPERARIO',
'Es vendedor o trabaja en atención al público': 'VENDEDOR',
'Trabaja en el hogar, no trabaja o estudia': 'HOGAR',
'Tiene un trabajo de tipo auxiliar administrativo (por ejemplo, secretario o asistente)': 'AUXILIAR',
'Es agricultor, pesquero o jornalero': 'AGRO',
'Trabaja como personal de limpieza, mantenimiento, seguridad o construcción': 'SERVICIOS GENERALES'
}, inplace=True)
#
pd.to_numeric(df_P3["FAMI_PERSONASHOGAR"])
pd.to_numeric(df_P3["FAMI_CUARTOSHOGAR"])
pd.to_numeric(df_P3["FAMI_NUMLIBROS"])
pd.to_numeric(df_P3["ESTU_DEDICACIONLECTURADIARIA"])
pd.to_numeric(df_P3["ESTU_DEDICACIONINTERNET"])
pd.to_numeric(df_P3["ESTU_HORASSEMANATRABAJA"])
0 0
1 0
2 40
3 20
4 0
..
52019 0
52020 0
52021 0
52022 0
52023 10
Name: ESTU_HORASSEMANATRABAJA, Length: 41952, dtype: int64
df_P3['ESTU_EN_RIESGO'] = np.where(df_P3['PUNT_GLOBAL']<= 255, '1', '0')
df_P3["ESTU_EN_RIESGO"] = df_P3["ESTU_EN_RIESGO"].astype("category")
<ipython-input-664-72529db033d7>:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3['ESTU_EN_RIESGO'] = np.where(df_P3['PUNT_GLOBAL']<= 255, '1', '0')
<ipython-input-664-72529db033d7>:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_P3["ESTU_EN_RIESGO"] = df_P3["ESTU_EN_RIESGO"].astype("category")
df_P3_DLC = df_P3[['ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_NUMLIBROS',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
'DESEMP_LECTURA_CRITICA'
]]
df_P3_DLC.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENECONSOLAVIDEOJUEGOS 41952 non-null object 9 FAMI_NUMLIBROS 41952 non-null int64 10 ESTU_DEDICACIONLECTURADIARIA 41952 non-null int64 11 ESTU_DEDICACIONINTERNET 41952 non-null int64 12 ESTU_HORASSEMANATRABAJA 41952 non-null int64 13 COLE_GENERO 41952 non-null object 14 COLE_CALENDARIO 41952 non-null object 15 COLE_CARACTER 41952 non-null object 16 COLE_AREA_UBICACION 41952 non-null object 17 DESEMP_LECTURA_CRITICA 41952 non-null category dtypes: category(1), int64(6), object(11) memory usage: 5.8+ MB
df_P3_DM = df_P3[[
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA',
'ESTU_TIPOREMUNERACION',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_AREA_UBICACION',
'DESEMP_MATEMATICAS'
]]
df_P3_DM.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 20 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENECONSOLAVIDEOJUEGOS 41952 non-null object 9 FAMI_COMELECHEDERIVADOS 41952 non-null object 10 FAMI_COMECARNEPESCADOHUEVO 41952 non-null object 11 FAMI_COMECEREALFRUTOSLEGUMBRE 41952 non-null object 12 FAMI_SITUACIONECONOMICA 41952 non-null object 13 ESTU_DEDICACIONINTERNET 41952 non-null int64 14 ESTU_HORASSEMANATRABAJA 41952 non-null int64 15 ESTU_TIPOREMUNERACION 41952 non-null object 16 COLE_GENERO 41952 non-null object 17 COLE_CALENDARIO 41952 non-null object 18 COLE_AREA_UBICACION 41952 non-null object 19 DESEMP_MATEMATICAS 41952 non-null category dtypes: category(1), int64(4), object(15) memory usage: 6.4+ MB
df_P3_DCN = df_P3[[
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'ESTU_DEDICACIONINTERNET',
'COLE_GENERO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
'DESEMP_C_NATURALES'
]]
df_P3_DCN.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENEAUTOMOVIL 41952 non-null object 9 FAMI_TIENEMOTOCICLETA 41952 non-null object 10 FAMI_COMELECHEDERIVADOS 41952 non-null object 11 FAMI_COMECARNEPESCADOHUEVO 41952 non-null object 12 FAMI_COMECEREALFRUTOSLEGUMBRE 41952 non-null object 13 ESTU_DEDICACIONINTERNET 41952 non-null int64 14 COLE_GENERO 41952 non-null object 15 COLE_CARACTER 41952 non-null object 16 COLE_AREA_UBICACION 41952 non-null object 17 DESEMP_C_NATURALES 41952 non-null category dtypes: category(1), int64(3), object(14) memory usage: 5.8+ MB
df_P3_DSC = df_P3[[
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA',
'ESTU_TIPOREMUNERACION',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_JORNADA',
'DESEMP_SOCIALES_CIUDADANAS'
]]
df_P3_DSC.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 23 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENEAUTOMOVIL 41952 non-null object 9 FAMI_TIENEMOTOCICLETA 41952 non-null object 10 FAMI_TIENECONSOLAVIDEOJUEGOS 41952 non-null object 11 FAMI_COMELECHEDERIVADOS 41952 non-null object 12 FAMI_COMECARNEPESCADOHUEVO 41952 non-null object 13 FAMI_COMECEREALFRUTOSLEGUMBRE 41952 non-null object 14 FAMI_SITUACIONECONOMICA 41952 non-null object 15 ESTU_DEDICACIONLECTURADIARIA 41952 non-null int64 16 ESTU_DEDICACIONINTERNET 41952 non-null int64 17 ESTU_HORASSEMANATRABAJA 41952 non-null int64 18 ESTU_TIPOREMUNERACION 41952 non-null object 19 COLE_GENERO 41952 non-null object 20 COLE_CALENDARIO 41952 non-null object 21 COLE_JORNADA 41952 non-null object 22 DESEMP_SOCIALES_CIUDADANAS 41952 non-null category dtypes: category(1), int64(5), object(17) memory usage: 7.4+ MB
df_P3_DI = df_P3[[
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_NUMLIBROS',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
'DESEMP_INGLES'
]]
df_P3_DI.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENEAUTOMOVIL 41952 non-null object 9 FAMI_TIENECONSOLAVIDEOJUEGOS 41952 non-null object 10 FAMI_NUMLIBROS 41952 non-null int64 11 ESTU_DEDICACIONLECTURADIARIA 41952 non-null int64 12 ESTU_DEDICACIONINTERNET 41952 non-null int64 13 COLE_GENERO 41952 non-null object 14 COLE_CALENDARIO 41952 non-null object 15 COLE_CARACTER 41952 non-null object 16 COLE_AREA_UBICACION 41952 non-null object 17 DESEMP_INGLES 41952 non-null category dtypes: category(1), int64(5), object(12) memory usage: 5.8+ MB
df_P3_EER = df_P3[[
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_NUMLIBROS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'ESTU_HORASSEMANATRABAJA',
'ESTU_TIPOREMUNERACION',
'COLE_CODIGO_ICFES',
'COLE_COD_DANE_ESTABLECIMIENTO',
'COLE_GENERO',
'COLE_NATURALEZA',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
'COLE_JORNADA',
'ESTU_EN_RIESGO'
]]
df_P3_EER.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 41952 entries, 0 to 52023 Data columns (total 30 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ESTU_GENERO 41952 non-null object 1 FAMI_ESTRATOVIVIENDA 41952 non-null object 2 FAMI_PERSONASHOGAR 41952 non-null int64 3 FAMI_CUARTOSHOGAR 41952 non-null int64 4 FAMI_EDUCACIONPADRE 41952 non-null object 5 FAMI_EDUCACIONMADRE 41952 non-null object 6 FAMI_TRABAJOLABORPADRE 41952 non-null object 7 FAMI_TRABAJOLABORMADRE 41952 non-null object 8 FAMI_TIENEHORNOMICROOGAS 41952 non-null object 9 FAMI_TIENEAUTOMOVIL 41952 non-null object 10 FAMI_TIENEMOTOCICLETA 41952 non-null object 11 FAMI_TIENECONSOLAVIDEOJUEGOS 41952 non-null object 12 FAMI_NUMLIBROS 41952 non-null int64 13 FAMI_COMELECHEDERIVADOS 41952 non-null object 14 FAMI_COMECARNEPESCADOHUEVO 41952 non-null object 15 FAMI_COMECEREALFRUTOSLEGUMBRE 41952 non-null object 16 FAMI_SITUACIONECONOMICA 41952 non-null object 17 ESTU_DEDICACIONLECTURADIARIA 41952 non-null int64 18 ESTU_DEDICACIONINTERNET 41952 non-null int64 19 ESTU_HORASSEMANATRABAJA 41952 non-null int64 20 ESTU_TIPOREMUNERACION 41952 non-null object 21 COLE_CODIGO_ICFES 41952 non-null int64 22 COLE_COD_DANE_ESTABLECIMIENTO 41952 non-null float64 23 COLE_GENERO 41952 non-null object 24 COLE_NATURALEZA 41952 non-null object 25 COLE_CALENDARIO 41952 non-null object 26 COLE_CARACTER 41952 non-null object 27 COLE_AREA_UBICACION 41952 non-null object 28 COLE_JORNADA 41952 non-null object 29 ESTU_EN_RIESGO 41952 non-null category dtypes: category(1), float64(1), int64(7), object(21) memory usage: 9.6+ MB
# Importación de paquetes y librerías
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font", size=14)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid", color_codes=True)
from sklearn import linear_model
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = ['ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_TIPOREMUNERACION',
'COLE_CODIGO_ICFES',
'COLE_COD_DANE_ESTABLECIMIENTO',
'COLE_GENERO',
'COLE_NATURALEZA',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
'COLE_JORNADA'
]
df_P3_EER_d = pd.get_dummies(df_P3_EER, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para ESTUDIANTE EN RIESGO
X_EER = df_P3_EER_d
y_EER = df_P3_EER_d['ESTU_EN_RIESGO']
X_EER.drop(axis = 1 , columns = 'ESTU_EN_RIESGO', inplace = True)
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_EER_train, X_EER_test, y_EER_train, y_EER_test = train_test_split(X_EER, y_EER, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_EER = lr.fit(X_EER_train, y_EER_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Consulta de resultados
print(modelo_EER.coef_)
[[-0.03705956 0.14317055 -0.01038596 ... 0.43915015 0.07878548 -0.02156643]]
# Uso del modelo para predicción
y_EER_pred = lr.predict(X_EER_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_EER_test, y_EER_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 84.55488022881659 %
# Matriz de confusión para el modelo EER - Estudiante En Riesgo
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_EER_test, y_EER_pred)
print(confusion_matrix)
[[5866 446] [ 850 1229]]
# Métricas de Desempeño para el modelo EER - Estudiante En Riesgo
from sklearn.metrics import classification_report
print(classification_report(y_EER_test, y_EER_pred))
precision recall f1-score support
0 0.87 0.93 0.90 6312
1 0.73 0.59 0.65 2079
accuracy 0.85 8391
macro avg 0.80 0.76 0.78 8391
weighted avg 0.84 0.85 0.84 8391
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = ['ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION',
]
df_P3_DLC_d = pd.get_dummies(df_P3_DLC, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para DESEMPEÑO LECTURA CRÍTICA
X_DLC = df_P3_DLC_d.iloc[:,:17]
y_DLC = df_P3_DLC_d['DESEMP_LECTURA_CRITICA']
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_DLC_train, X_DLC_test, y_DLC_train, y_DLC_test = train_test_split(X_DLC, y_DLC, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_DLC = lr.fit(X_DLC_train, y_DLC_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Consulta de resultados
print(modelo_DLC.coef_)
[[-5.61173957e-02 -5.03961240e-02 5.36384376e-03 -1.28898285e-02 -5.47184619e-03 6.45956872e-02 -3.36284974e-01 -1.28092393e-02 -1.15988391e-02 6.36828205e-03 2.69553556e-03 -1.06640354e-02 -1.14716183e-02 -1.10327954e-02 -3.20906048e-03 2.90561365e-03 -1.60789621e-02] [ 4.74896563e-01 2.29822716e-01 -1.52360001e-02 2.60048012e-03 2.25137860e-03 1.71616427e-02 -9.05491419e-01 6.55629731e-02 2.39249016e-02 8.10041976e-02 1.17100333e-01 6.39872733e-02 -5.49934311e-02 -6.33473428e-02 -6.26737941e-02 8.41063844e-03 -8.22535273e-02] [ 1.09925940e-01 1.71499037e-01 4.12290147e-04 5.27514343e-03 4.66959329e-03 3.63487485e-04 -2.00616715e-01 4.27044458e-02 4.43182525e-02 -1.83882710e-02 4.02492289e-02 1.13469149e-01 3.18525661e-02 -2.83506278e-02 -4.34971779e-02 -8.31216855e-03 3.78277145e-02] [-5.28705107e-01 -3.50925628e-01 9.45986620e-03 5.01420499e-03 -1.44912570e-03 -8.21208174e-02 1.44239311e+00 -9.54581796e-02 -5.66443150e-02 -6.89842086e-02 -1.60045098e-01 -1.66792387e-01 3.46124833e-02 1.02730766e-01 1.09380032e-01 -3.00408355e-03 6.05047749e-02]]
# Uso del modelo para predicción
y_DLC_pred = lr.predict(X_DLC_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_DLC_test, y_DLC_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 66.42831605291384 %
# Matriz de confusión para el modelo DLC - Desempeño en Lectura Crítica
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_DLC_test, y_DLC_pred)
print(confusion_matrix)
[[ 0 128 27 0] [ 21 486 838 45] [ 21 178 2544 934] [ 0 4 621 2544]]
# Métricas de Desempeño para el modelo DLC - Desempeño en Lectura Crítica
from sklearn.metrics import classification_report
print(classification_report(y_DLC_test, y_DLC_pred))
precision recall f1-score support
1 0.00 0.00 0.00 155
2 0.61 0.35 0.44 1390
3 0.63 0.69 0.66 3677
4 0.72 0.80 0.76 3169
accuracy 0.66 8391
macro avg 0.49 0.46 0.47 8391
weighted avg 0.65 0.66 0.65 8391
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = ['ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_TIPOREMUNERACION',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_AREA_UBICACION']
df_P3_DM_d = pd.get_dummies(df_P3_DM, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para DESEMPEÑO EN MATEMATICAS
X_DM = df_P3_DM_d
y_DM = df_P3_DM_d['DESEMP_MATEMATICAS']
X_DM.drop(axis = 1 , columns = 'DESEMP_MATEMATICAS', inplace = True)
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_DM_train, X_DM_test, y_DM_train, y_DM_test = train_test_split(X_DM, y_DM, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_DM = lr.fit(X_DM_train, y_DM_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Uso del modelo para predicción
y_DM_pred = lr.predict(X_DM_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_DM_test, y_DM_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 57.4901680371827 %
# Matriz de confusión para el modelo DM - Desempeño en Matemáticas
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_DM_test, y_DM_pred)
print(confusion_matrix)
[[ 1 235 160 3] [ 3 566 1008 28] [ 1 322 3492 560] [ 0 10 1237 765]]
# Métricas de Desempeño para el modelo DM - Desempeño en Matemáticas
from sklearn.metrics import classification_report
print(classification_report(y_DM_test, y_DM_pred))
precision recall f1-score support
1 0.20 0.00 0.00 399
2 0.50 0.35 0.41 1605
3 0.59 0.80 0.68 4375
4 0.56 0.38 0.45 2012
accuracy 0.57 8391
macro avg 0.46 0.38 0.39 8391
weighted avg 0.55 0.57 0.54 8391
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = [
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'ESTU_DEDICACIONINTERNET',
'COLE_GENERO',
'COLE_CARACTER',
'COLE_AREA_UBICACION'
]
df_P3_DCN_d = pd.get_dummies(df_P3_DCN, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para DESEMPEÑO EN CIENCIAS NATURALES
X_DCN = df_P3_DCN_d
y_DCN = df_P3_DCN_d['DESEMP_C_NATURALES']
X_DCN.drop(axis = 1 , columns = 'DESEMP_C_NATURALES', inplace = True)
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_DCN_train, X_DCN_test, y_DCN_train, y_DCN_test = train_test_split(X_DCN, y_DCN, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_DCN = lr.fit(X_DCN_train, y_DCN_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Uso del modelo para predicción
y_DCN_pred = lr.predict(X_DCN_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_DCN_test, y_DCN_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 54.1055893218925 %
# Matriz de confusión para el modelo DM - Desempeño en Ciencias Naturales
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_DCN_test, y_DCN_pred)
print(confusion_matrix)
[[ 133 541 183 1] [ 92 1172 1221 4] [ 13 583 3187 62] [ 0 50 1101 48]]
# Métricas de Desempeño para el modelo DM - Desempeño en Ciencias Naturales
from sklearn.metrics import classification_report
print(classification_report(y_DCN_test, y_DCN_pred))
precision recall f1-score support
1 0.56 0.16 0.24 858
2 0.50 0.47 0.48 2489
3 0.56 0.83 0.67 3845
4 0.42 0.04 0.07 1199
accuracy 0.54 8391
macro avg 0.51 0.37 0.37 8391
weighted avg 0.52 0.54 0.49 8391
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = [
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'FAMI_SITUACIONECONOMICA',
'ESTU_TIPOREMUNERACION',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_JORNADA'
]
df_P3_DSC_d = pd.get_dummies(df_P3_DSC, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para DESEMPEÑO EN SOCIALES CIUDADANAS
X_DSC = df_P3_DSC_d
y_DSC = df_P3_DSC_d['DESEMP_SOCIALES_CIUDADANAS']
X_DSC.drop(axis = 1 , columns = 'DESEMP_SOCIALES_CIUDADANAS', inplace = True)
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_DSC_train, X_DSC_test, y_DSC_train, y_DSC_test = train_test_split(X_DSC, y_DSC, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_DSC = lr.fit(X_DSC_train, y_DSC_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Uso del modelo para predicción
y_DSC_pred = lr.predict(X_DSC_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_DSC_test, y_DSC_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 49.52925753783816 %
# Matriz de confusión para el modelo DSC - Desempeño en Sociales Ciudadanas
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_DSC_test, y_DSC_pred)
print(confusion_matrix)
[[ 301 557 279 0] [ 222 920 1108 0] [ 58 499 2935 0] [ 3 67 1442 0]]
# Métricas de Desempeño para el modelo DDSC - Desempeño en Sociales Ciudadanas
from sklearn.metrics import classification_report
print(classification_report(y_DSC_test, y_DSC_pred))
precision recall f1-score support
1 0.52 0.26 0.35 1137
2 0.45 0.41 0.43 2250
3 0.51 0.84 0.63 3492
4 0.00 0.00 0.00 1512
accuracy 0.50 8391
macro avg 0.37 0.38 0.35 8391
weighted avg 0.40 0.50 0.43 8391
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1245: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\ProgramData\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1245: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\ProgramData\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1245: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))
# Proceso de creación de variables dummie a partir de las variables categóricas
cols = [
'ESTU_GENERO',
'FAMI_ESTRATOVIVIENDA',
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'COLE_GENERO',
'COLE_CALENDARIO',
'COLE_CARACTER',
'COLE_AREA_UBICACION'
]
df_P3_DI_d = pd.get_dummies(df_P3_DI, prefix=None, prefix_sep='_', dummy_na=False, sparse=False, drop_first=False, dtype=None, columns=cols)
# Elección de datos a analizar. Definición de variables predictoras y objetivo para DESEMPEÑO EN INGLÉS
X_DI = df_P3_DI_d
y_DI = df_P3_DI_d['DESEMP_INGLES']
X_DI.drop(axis = 1 , columns = 'DESEMP_INGLES', inplace = True)
# Creación de conjuntos de datos para entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_DI_train, X_DI_test, y_DI_train, y_DI_test = train_test_split(X_DI, y_DI, test_size=0.2)
# Declaración de la instancia del modelo
lr = LogisticRegression()
# Entrenamiento del modelo
modelo_DI = lr.fit(X_DI_train, y_DI_train)
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:763: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# Uso del modelo para predicción
y_DI_pred = lr.predict(X_DI_test)
# Evaluación del desempeño del modelo - Accuracy
accuracy = lr.score(X_DI_test, y_DI_test)
print('La exactitud del clasificador de regresión logística en los datos de prueba: ', accuracy*100,"%")
La exactitud del clasificador de regresión logística en los datos de prueba: 48.337504469074005 %
# Matriz de confusión para el modelo DSC - Desempeño en Sociales Ciudadanas
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_DI_test, y_DI_pred)
print(confusion_matrix)
[[1019 144 116 21 121] [ 386 237 248 90 253] [ 187 197 291 227 436] [ 20 23 53 1922 461] [ 81 120 201 950 587]]
# Métricas de Desempeño para el modelo DDSC - Desempeño en Sociales Ciudadanas
from sklearn.metrics import classification_report
print(classification_report(y_DI_test, y_DI_pred))
precision recall f1-score support
A- 0.60 0.72 0.65 1421
A1 0.33 0.20 0.24 1214
A2 0.32 0.22 0.26 1338
B+ 0.60 0.78 0.68 2479
B1 0.32 0.30 0.31 1939
accuracy 0.48 8391
macro avg 0.43 0.44 0.43 8391
weighted avg 0.45 0.48 0.46 8391
pip install Pillow
Requirement already satisfied: Pillow in c:\programdata\anaconda3\lib\site-packages (8.2.0)Note: you may need to restart the kernel to use updated packages.
### A continuación una imagen que muestra las variables predictoras utilizadas para cada fenómeno escolar:
from PIL import Image
os.chdir("C:/Users/CamiloAndradePerez/Documents/CAMILO ANDRADE PEREZ/Educación Formal/Maestría Analítica Uniandes/Semestre I/HCAD/Archivos")
myImage = Image.open("./Objetivos_vs_Predictores.png")
myImage.show()
# Importación de librería Kmeans
from sklearn.cluster import KMeans
# Creación de instancia del modelo de segmentación
model = KMeans(n_clusters=4)
res_seg_P3
array([3, 0, 1, ..., 1, 0, 1])
# Modelado de segmentación con el dataframe de Estudiantes en Riesgo
model.fit(df_P3_EER_d)
KMeans(n_clusters=4)
# Nuevo vector con resultados de segmentación
res_seg_P3 = model.labels_
# Adición de los resultados de la segmentación al dataframe original
df_P3_EER_d['cluster'] = res_seg_P3
Esta misión consiste en desarrollar una herramienta interactiva sencilla (que sea relevante en el contexto del problema) a partir de alguno de los análisis realizados en las secciones 2 o 3.
Pautas generales:
ipywidgets o panel para implementar la herramienta.Pregunta guía:
El entregable de esta misión es la herramienta implementada, acompañada de las instrucciones necesarias para que un usuario la pueda utilizar.
# Instalación del paquete Plotly
!pip install plotly
Requirement already satisfied: plotly in c:\programdata\anaconda3\lib\site-packages (5.4.0) Requirement already satisfied: tenacity>=6.2.0 in c:\programdata\anaconda3\lib\site-packages (from plotly) (8.0.1) Requirement already satisfied: six in c:\programdata\anaconda3\lib\site-packages (from plotly) (1.15.0)
# Importación de paquetes y librerías
import ipywidgets as widgets
import pandas as pd
import plotly.graph_objects as go
# Creación de nuevo dataset para crear la visualización interactiva
df_P4_EER = df_P3_EER
# Reemplazo de valores binarios por texto
df_P4_EER = df_P4_EER["ESTU_EN_RIESGO"].replace({'0': 'NO RIESGO', '1': 'SI RIESGO'})
# Declaración de widget tipo Barra Deslizante que asociaremos a la variable Cantidad de Libros en Casa
libros_en_casa = widgets.IntSlider(min = 1.0, max = 100.0, step = 10.0)
# Declaración de widget tipo Barra Deslizante que asociaremos a la variable Personas en Casa
personas_en_hogar = widgets.IntSlider(min = 1.0, max = 10.0, step = 1.0)
# Definición función filtro
def valores_filtro_columna(columna):
columna = columna.astype(str) # Convertimos en str los valores de la columna que entra por parámetro.
valores = columna.unique().tolist() # Guardamos una lista con los valores únicos de la columna que entra por parámetro.
valores = sorted(valores) # Organizamos la lista de valores únicos de manera ascedente.
valores.insert(0, "Todos") # Agregamos el elemento "Todos" en la primera posición de la lista.
return valores
# Declaración del widget tipo Lista Desplegable que asociaremos a la variable Trabajo o Labor Padre
labor_Padre = widgets.Dropdown(
description = 'Labor Padre:',
options = df_P3_EER['FAMI_TRABAJOLABORPADRE'].unique().tolist(),
style = {'description_width': 'initial'} # Mostrar el nombre completo.
)
# Declaración del widget tipo Lista Desplegable que asociaremos a la variable Educación Madre
educacion_Madre = widgets.Dropdown(
description = 'Educación Madre:',
options = df_P3_EER['FAMI_EDUCACIONMADRE'].unique().tolist(),
style = {'description_width': 'initial'} # Mostrar el nombre completo.
)
# Declaración del widget tipo Lista Desplegable que asociaremos a la variable Ubicación del Colegio
ubicacion_colegio = widgets.Dropdown(
description = 'Ubicación_colegio:',
options = df_P3_EER['COLE_AREA_UBICACION'].unique().tolist(),
style = {'description_width': 'initial'} # Mostrar el nombre completo.
)
# Declaración del widget tipo Lista Desplegable que asociaremos a la variable Consumo Proteina Animal
proteina_animal = widgets.Dropdown(
description = 'Consumo Proteina Animal:',
options = df_P3_EER['FAMI_COMECARNEPESCADOHUEVO'].unique().tolist(),
style = {'description_width': 'initial'} # Mostrar el nombre completo.
)
# Declaración de la figura del gráfico Histograma que asociaremos a la variable Estudiante en Riesgo
fig = go.FigureWidget(
data = go.Histogram(name = 'ESTU_EN_RIESGO'),
layout = go.Layout(
title = 'Estudiantes en riesgo de bajo desempeño escolar',
xaxis_title = 'Categoría Desempeño 0: No Riesgo, 1: Sí Riesgo',
yaxis_title = 'Cantidad de Estudiantes',
)
)
# Definición de la función filtrado para ajustar el histograma a la selección del usuario
def filtrar():
filtrar_lista = [i and j and k and l and m and n for i, j, k, l, m, n in zip(
df_P3_EER['FAMI_NUMLIBROS'] >= libros_en_casa.value,
df_P3_EER['FAMI_PERSONASHOGAR'] >= personas_en_hogar.value,
df_P3_EER['FAMI_TRABAJOLABORPADRE'] == labor_Padre.value,
df_P3_EER['COLE_AREA_UBICACION'] == ubicacion_colegio.value,
df_P3_EER['FAMI_EDUCACIONMADRE'] == educacion_Madre.value,
df_P3_EER['FAMI_COMECARNEPESCADOHUEVO'] == proteina_animal.value
)
]
df_temporal = df_P3_EER[filtrar_lista]
fig.data[0].x = df_temporal['ESTU_EN_RIESGO'] # Establecemos los datos en el eje x.
# Definición de una variable que aloja los resultados para ajustar el gráfico
def respuesta(change):
filtrar()
# Vinculación de los controles con la función respuesta
ubicacion_colegio.observe(respuesta, names = 'value')
labor_Padre.observe(respuesta, names = 'value')
libros_en_casa.observe(respuesta, names = 'value')
educacion_Madre.observe(respuesta, names = 'value')
proteina_animal.observe(respuesta, names = 'value')
personas_en_hogar.observe(respuesta, names = 'value')
# Inicialización de los valores del gráfico
filtrar()
# Definción de los componentes de la parte superior del gráfico
parte_superior_1 = widgets.HBox([widgets.Label('Cantidad de libros en Casa:'),libros_en_casa])
parte_superior_2 = widgets.HBox([widgets.Label('Cantidad de personas en el hogar:'),personas_en_hogar])
# Definción de los componentes de la parte inferior del gráfico
parte_inferior_1 = widgets.HBox([ubicacion_colegio, proteina_animal])
parte_inferior_2 = widgets.HBox([labor_Padre, educacion_Madre])
# Vinculación de los controles y el gráfico
visualizacion = widgets.VBox(
[parte_superior_1,
parte_superior_2,
parte_inferior_1,
parte_inferior_2,
fig]
)
# Visualización de los controles y el gráfico interactivo
display(visualizacion)